package org.subatu.orm.query.condition;


import org.springframework.util.Assert;
import org.subatu.orm.query.base.BaseSql;
import org.subatu.orm.query.brige.HavingOrderBy;
import org.subatu.orm.query.function.FunctionToQueryColumnUtil;
import org.subatu.orm.query.function.SFunction;

/**
 * 聚合
 */
public interface GroupBy extends BaseSql {

    // groupBy 部分的sql
    // StringBuilder groupBySql = new StringBuilder();


    default <E> HavingOrderBy groupBy(SFunction<E>... columns) {
        // 加入到查询队列
        sqlData().groupByList.addAll(FunctionToQueryColumnUtil.toQueryColumn(columns));
        return (HavingOrderBy) this;
    }

    default HavingOrderBy groupBy(String sql) {
        // 加入到查询队列
        sqlData().groupBySql.setLength(0);
        sqlData().groupBySql.append(sql);
        return (HavingOrderBy) this;
    }

    default String buildGroupBySql() {
        if (sqlData().groupBySql.length() > 0 || sqlData().groupByList.size() == 0) {
            // 如果手工设置了 sql, 直接返回
            return sqlData().groupBySql.toString();
        }

        // 组装 sql
        sqlData().groupBySql.setLength(0);
        sqlData().groupBySql.append(" group by ");
        Assert.notEmpty(sqlData().groupByList, ".select() 不能为空.请设置查询字段");

        // 组装所有 列
        sqlData().groupByList.forEach((queryColumn) -> {
            String tableAlias = this.sqlData().tableAliasMap.get(queryColumn.getTable().getTableName());
            String columnSql = queryColumn.buildSql(tableAlias);
            sqlData().groupBySql.append(columnSql);
        });

        // 去掉 列 最后的逗号
        sqlData().groupBySql.deleteCharAt(sqlData().groupBySql.length() - 1);
        sqlData().groupBySql.append(' ');

        return sqlData().groupBySql.toString();
    }


}
